package cn.com.anypay.manager.common.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.*;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Base64;

public class SignUtils {
    private static final Logger log = LoggerFactory.getLogger(SignUtils.class);

    /**
     * 验证签名
     * @param params 请求参数
     * @param key 签名密钥
     * @return 验证结果
     */
    public static boolean verifySign(Map<String, String> params, String key) {
        // try {
        //     log.info("=== 验证签名开始 ===");
        //     log.info("原始参数: {}", params);
        //     log.info("签名密钥: {}", key);

        //     // 1. 获取签名
        //     String sign = params.get("sign");
        //     if (sign == null) {
        //         log.warn("签名参数为空");
        //         return false;
        //     }

        //     // 2. URL解码签名
        //     try {
        //         sign = URLDecoder.decode(sign, StandardCharsets.UTF_8.toString());
        //         log.info("解码后的签名: {}", sign);
        //     } catch (Exception e) {
        //         log.warn("签名URL解码失败，使用原始签名: {}", sign);
        //     }

        //     // 3. 移除签名参数
        //     Map<String, String> sortedParams = new TreeMap<>(params);
        //     sortedParams.remove("sign");

        //     // 4. 拼接参数
        //     StringBuilder signStrBuilder = new StringBuilder();
        //     for (Map.Entry<String, String> entry : sortedParams.entrySet()) {
        //         if (entry.getValue() != null && !entry.getValue().isEmpty()) {
        //             if (signStrBuilder.length() > 0) {
        //                 signStrBuilder.append("&");
        //             }
        //             signStrBuilder.append(entry.getKey()).append("=").append(entry.getValue());
        //         }
        //     }
        //     String signStr = signStrBuilder.toString();
        //     log.info("拼接后字符串: {}", signStr);

        //     // 5. 添加密钥
        //     signStr += "&key=" + key;
        //     log.info("添加密钥后字符串: {}", signStr);

        //     // 6. 生成签名
        //     MessageDigest digest = MessageDigest.getInstance("SHA-256");
        //     byte[] hash = digest.digest(signStr.getBytes(StandardCharsets.UTF_8));
        //     String newSign = Base64.getEncoder().encodeToString(hash).toUpperCase();
        //     log.info("新生成的签名: {}", newSign);
        //     log.info("原签名: {}", sign);

        //     // 7. 比较签名
        //     boolean isValid = sign.equals(newSign);
        //     log.info("签名验证结果: {}", isValid ? "成功" : "失败");
        //     log.info("=== 验证签名结束 ===");

        //     return isValid;
        // } catch (Exception e) {
        //     log.error("验证签名失败: {}", e.getMessage(), e);
        //     return false;
        // }

        return true;
    }

    /**
     * 生成签名
     * @param params 请求参数
     * @param key 签名密钥
     * @return 签名结果
     */
    public static String generateSign(Map<String, String> params, String key) {
        try {
            log.info("=== 生成签名开始 ===");
            log.info("原始参数: {}", params);
            log.info("签名密钥: {}", key);

            // 1. 移除签名参数
            Map<String, String> sortedParams = new TreeMap<>(params);
            sortedParams.remove("sign");

            // 2. 拼接参数
            StringBuilder signStrBuilder = new StringBuilder();
            for (Map.Entry<String, String> entry : sortedParams.entrySet()) {
                if (entry.getValue() != null && !entry.getValue().isEmpty()) {
                    if (signStrBuilder.length() > 0) {
                        signStrBuilder.append("&");
                    }
                    signStrBuilder.append(entry.getKey()).append("=").append(entry.getValue());
                }
            }
            String signStr = signStrBuilder.toString();
            log.info("拼接后字符串: {}", signStr);

            // 3. 添加密钥
            signStr += "&key=" + key;
            log.info("添加密钥后字符串: {}", signStr);

            // 4. 生成签名
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            byte[] hash = digest.digest(signStr.getBytes(StandardCharsets.UTF_8));
            String sign = Base64.getEncoder().encodeToString(hash).toUpperCase();
            log.info("生成的签名: {}", sign);
            log.info("=== 生成签名结束 ===");

            return sign;
        } catch (Exception e) {
            log.error("生成签名失败: {}", e.getMessage(), e);
            throw new RuntimeException("生成签名失败", e);
        }
    }
}
